import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 写一个账户管理系统(BankAccountManager)，账户的名称和余额都要从键盘接收，
// 1:添加账号，2：存钱，3：取钱，4：退出
public class BankAccountManager {
    // 创建一个容器用来保存所有的账户信息
    private static List accountList = new ArrayList();

    public static void main(String[] args) {

        // 1.创建一个扫描器
        Scanner scanner = new Scanner(System.in);

        // 3.接收键盘输入
        while (true) {
            System.out.println("1:添加账户,2:存钱,3：取钱,4:查询，5:转账,6:退出");
            int num = scanner.nextInt();
            if (num == 1) {
                addAccount(scanner); // 调用实现添加账户方法
            } else if (num == 2) {
                inMoney(scanner);// 调用实现存钱逻辑的方法
            } else if (num == 3) {
                outMoney(scanner);// 调用实现取钱的逻辑方法
            } else if (num == 4) {
                getAccountList();
            } else if (num == 5) {
                transfor(scanner);// 调用转账的方法实现一个转账业务
            } else if (num == 6) {
                System.out.println("欢迎下次再来!!!");
                System.exit(-1);
            }
        }
    }

    private static void transfor(Scanner scanner) {
        // 1、输入用户的转账信息
        System.out.println("请输入转出的账户:");
        String outName = scanner.next();

        System.out.println("请输入转入账户:");
        String inName = scanner.next();

        System.out.println("请输入转账的金额:");
        double money = scanner.nextDouble();

        // 2.检查转出的账户是否存在
        BankAccount outAccount = getAccount(outName);
        if (outAccount == null) {
            System.out.println("转出账户【" + outName + "】不存在");
            return;
        }

        // 3.检查转入账户是否存在
        BankAccount inAccount = getAccount(inName);
        if (inAccount == null) {
            System.out.println("转入账户【" + inName + "】不存在");
            return;
        }

        // 4、判断转账金额是否成立
        if (money <= 0) {
            System.out.println("请输入合理的金额");
            return;
        }

        // 5、判断账号余额是否充足(余额和转账的金额)
        if (outAccount.getBalance() < money) {
            System.out.println("余额不足");
            return;
        }

        // 6、扣钱
        outAccount.out(money);
        inAccount.in(money);
        System.out.println("转账成功");

        // 判断长转出的账号是否存在
        // 在输入转入的账号
        // 判断转入账号是否存在
        // 【判断转账金额<=余额】

        // 实现转入，转出
        // 提示转账成功
    }

    private static void outMoney(Scanner scanner) {
        // 1.先输入要取钱的账号
        System.out.println("请输入取钱的账号:");
        String balance = scanner.next();

        // 2.判断账号是否存在
        BankAccount account = getAccount(balance);

        if (account != null) {
            // 找到这个账户了
            System.out.println("请输入金额:");
            double money = scanner.nextDouble();

            if (money <= 0) {
                System.out.println("输入的金额要大于0");
                return;
            }
            // 对应的账户扣钱
            account.out(money);
            System.out.println("取钱成功");
        } else {
            // 没有找到这个账户
            System.out.println("没有找到【" + balance + "】账户");
        }

    }

    private static void inMoney(Scanner scanner) {

        // 1.输入要存钱的账户名
        System.out.println("请输入要存入的账号:");
        String account = scanner.next();

        // 2.判断当前账号是否存在
        BankAccount bankAccount = getAccount(account);
        if (bankAccount == null) {
            System.out.println("输入的账号不存在");
            return;
        }
        // 3.输入要存入的金额
        System.out.println("请输入要存入的金额:");
        double money = scanner.nextDouble();
        if (money <= 0) {
            System.out.println("输入的金额要大于0");
            return;
        }

        // 4.调用该账户的存钱方法
        bankAccount.in(money);

        System.out.println("存钱成功");
    }

    private static BankAccount getAccount(String account) {
        // 使用输入的账号去和集合中的账号做一个比对
        for (Object o : accountList) {
            BankAccount bankAccount = (BankAccount) o;
            if (account.equals(bankAccount.getAccount())) {
                return bankAccount;
            }
        }
        return null;
    }

    private static void getAccountList() {
        for (Object o : accountList) {
            System.out.println(o);
        }
    }

    private static void addAccount(Scanner scanner) {
        // 1.接收键盘输入
        System.out.println("请输入账户:");
        String account = scanner.next();

        System.out.println("请输账号金额:");
        double balance = scanner.nextDouble();

        // 2、把两个属性给他封装到一个对象中
        BankAccount bankAccount = new BankAccount();
        bankAccount.setAccount(account);
        bankAccount.setBalance(balance);

        // 3、把账户添加到集合中
        accountList.add(bankAccount);
    }
}